#include <google/protobuf/message.h>
#include <google/protobuf/unknown_field_set.h>
#include <iostream>
#include <fstream>
#include "contacts.pb.h"
using namespace std;
using namespace c_contacts;
/**
* 打印联系⼈列表
*/
void PrintfContacts(const Contacts& contacts) 
{
    for (int i = 0; i < contacts.contacts_size(); ++i) 
    {
        const PeopleInfo& people = contacts.contacts(i);
        cout << "------------联系⼈" << i+1 << "------------" << endl;
        cout << "姓名：" << people.name() << endl;
        cout << "年龄：" << people.age() << endl;
        int j = 1;
        for (const PeopleInfo_Phone& phone : people.phone())
        {
            cout << "电话" << j++ << ": " << phone.number() << endl;
        }

        const google::protobuf::Reflection* reflection = PeopleInfo::GetReflection();
        const google::protobuf::UnknownFieldSet& set = reflection->GetUnknownFields(people);
        for(int j = 0 ; j < set.field_count() ;j++)
        {
            const google::protobuf::UnknownField& unknown_field = set.field(j);
            cout << "未知字段" << j+1 << ": " << "  字段编号: " << unknown_field.number();
            switch (unknown_field.type()) 
            {
              case google::protobuf::UnknownField::Type::TYPE_VARINT:
                 cout << "  值:" << unknown_field.varint() << endl;
                 break;;
              case google::protobuf::UnknownField::Type::TYPE_LENGTH_DELIMITED:
                 cout << "  值:" << unknown_field.length_delimited() << endl;
                 break;
              //..case..
               default: 
                 break;     
            }
        }
    }
}

int main() 
{
    // 以⼆进制⽅式读取 contacts
    Contacts contacts;
    fstream input("../server/contacts.bin", ios::in | ios::binary);
    if (!contacts.ParseFromIstream(&input)) 
    {
        cerr << "Failed to parse contacts." << endl;
        input.close();
        return -1;
    }
    // 打印 contacts
    PrintfContacts(contacts);
    input.close();
    google::protobuf::ShutdownProtobufLibrary();
    return 0;
}